package com.wangp.mywrite.s_netty.nio.ch1;

import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * <p>
 * ByteBuffer 内部有 position,limit,capacity.
 * <pre>一开始的写模式：写文件的时间，一直从position 写到 limit </pre>
 * <pre>切换读模式：读文件的时间，limit 到 position 位置，重置 position 到起始位置，一直可以从 position 到 limit </pre>
 * <pre>切换写模式：clear(),position到起始位置开始写，limit 到 capacity 位置 </pre>
 * <pre>切换写模式：compact (),position到上次未读完的位置开始写，limit 到 capacity 位置 </pre>
 * </p>
 * @author tooStronger
 * @date 2023/3/15
 */
@Slf4j
public class TestByteBuffer {

    public static void main(String[] args) throws FileNotFoundException {
        // 1. 输入输出流
        try (FileChannel channel = new FileInputStream("data.txt文件路径").getChannel()) {
            // 准备缓存区
            ByteBuffer byteBuffer = ByteBuffer.allocate(10);
            // 从 channel 读取数据
            while (true) {
                int len = channel.read(byteBuffer);
                log.info("读取到的字节数:{}",len);
                // -1 就是没内容了
                if (len == -1) {
                    break;
                }
                // 打印 buffer 内容
                byteBuffer.flip(); // 切换至读模式
                while (byteBuffer.hasRemaining()) {
                    byte b = byteBuffer.get();
                    log.info("实际字节:{}",(char) b);
                }
                byteBuffer.clear(); //切换为写模式
            }

        } catch (IOException ignore) {
        }
    }
}
